#include <iostream>

void Test01() {
	int arr[3] = { 1,2,3 };
	//数组的地址和首元素的地址是一样的
	std::cout << "arr的地址是：" << &arr << std::endl;
	std::cout << "arr[0]的地址是：" << &arr[0] << std::endl;
}

void Test02() {
	int arr[3] = { 1,2,3 };

	//数组是挨着的，地址是连续的
	std::cout << "arr[0]的地址是：" << &arr[0] << std::endl;
	std::cout << "arr[1]的地址是：" << &arr[1] << std::endl;
	std::cout << "arr[2]的地址是：" << &arr[2] << std::endl;
}


void Test03() {
	int arr[3] = { 1,2,3 };
	//可以使用指针来访问数组1
	int* ptr = arr;
	std::cout << "ptr[0]的值是：" << *ptr << std::endl;
	std::cout << "ptr[1]的值是：" << *(ptr + 1) << std::endl;
	std::cout << "ptr[2]的值是：" << *(ptr + 2) << std::endl;
}


void Test04() {
	int arr[3] = { 1,2,3 };
	//可以使用指针来访问数组2
	int* ptr2 = arr;
	std::cout << "ptr2[0]的值是：" << ptr2[0] << std::endl;
	std::cout << "ptr2[1]的值是：" << ptr2[1] << std::endl;
	std::cout << "ptr2[2]的值是：" << ptr2[2] << std::endl;
}

void Test05() {
	int arr[3] = { 1,2,3 };

	//可以通过地址差来访问数组
	int* ptr3 = &arr[2];
	std::cout << "ptr3和首元素的相对位置是：" << ptr3 - arr << std::endl;
	std::cout << "ptr3指向的值是：" << arr[ptr3 - arr] << std::endl;
}

/**
 * 二维数组看起来是个矩阵，但在内存上，还是连续存储的
 */
void Test06() {
	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
	std::cout << "arr[0][0]的地址是：" << &arr[0][0] << std::endl;
	//std::cout << "arr[0][1]的地址是：" << &arr[0][1] << std::endl;
	//std::cout << "arr[0][2]的地址是：" << &arr[0][2] << std::endl;
	std::cout << "arr[1][0]的地址是：" << &arr[1][0] << std::endl;
	//std::cout << "arr[1][1]的地址是：" << &arr[1][1] << std::endl;
	//std::cout << "arr[1][2]的地址是：" << &arr[1][2] << std::endl;
	std::cout << "arr[2][0]的地址是：" << &arr[2][0] << std::endl;
	//std::cout << "arr[2][1]的地址是：" << &arr[2][1] << std::endl;
	//std::cout << "arr[2][2]的地址是：" << &arr[2][2] << std::endl;
	std::cout << "arr[0]的地址是：" << &arr[0] << std::endl;
	std::cout << "arr[1]的地址是：" << &arr[1] << std::endl;
	std::cout << "arr[2]的地址是：" << &arr[2] << std::endl;
}

/**
 * 数组为参数
 * @param arr 
 */
void Hello(int arr[]) {
	std::cout << arr << std::endl;
}

/**
 * 数组退化成指针
 */
void Test07() {
	int arr[] = { 1,2,3 };
	Hello(arr);
}

/**
 * 接受一个二维数组
 */
void Hello2(int arr[][3]) {
	
}


/**
 * 二维数组作为函数参数
 */
void Test08() {
	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };

	Hello2(arr);
}

/**
 * 数组和指针
 * @return
 */
int main() {
	Test08();

	return 0;
}